package _2_2基础算法;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;

public class _2128贪心_差分_重新排序 {
	public static void main(String[] args) throws IOException {
		MyScanner scan = new MyScanner();
		int n = scan.nextInt();
		int arr[] = new int[n];
		int diff[] = new int[n];
		
		for (int i = 0; i < n; i++) {
			arr[i] = scan.nextInt();
		}
		// 此题需要输入查询区间l r,将区间内的元素加起来，并且会输入多次l r,最终所有的元素相加
		// 最终题目要求：将arr进行排序，排序后进行多次查询，最终使得每个查询的结果的和 尽可能最大，
		// 				最终答案给出最终数组 查询和 比原数组 查询和 增加了多少
		// 要求最大，因此就需要arr数组中最大的元素出现的次数最多 第二大的元素出现第二多 以此类推
		/* 解题思路：
		 * 	1. 通过差分，再进行差分的前缀和计算，得到每个元素被查询的次数
		 * 	2. 将 arr每个元素 与 差分取完前缀和的数组 对应下标元素相乘再累加，此次乘的元素就是该元素查询过的次数
		 *  3. 将 arr 和 差分取完前缀和数组 进行从大到小的排序，此时就能得到最大的元素在最后，出现最多的次数在最后
		 *  4. 将 排序完的arr和前缀和数组 对应下标元素相乘再累加，此时就得到了最佳排序的和
		 *  5. 最后将两个总和相减 就是最终答案
		 * */
		int m = scan.nextInt();
		for(int i = 0; i < m; i++) {
			int l,r;
			l = scan.nextInt() - 1;
			r = scan.nextInt() - 1;
			// 完成差分
			diff[l]++;
			if(r+1 < n) {
				diff[r+1]--;
			}
		}
		
		// 差分数组取前缀和
		for(int i = 1; i < n; i++) {
			diff[i] += diff[i-1];
		}
		
		// 排序前的乘方
		long ans = 0;
		for(int i = 0;i < n; i++) {
			ans += (long)arr[i] * diff[i];
		}
		
		Arrays.sort(arr);
		Arrays.sort(diff);
		
		// 排序后的乘方
		long res = 0;
		for(int i = 0; i < n; i++) {
			res += (long)arr[i] * diff[i];
		}

		System.out.println(res - ans);

	}
}

class MyScanner {
    BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
    StreamTokenizer st  = new StreamTokenizer(br);

    public int nextInt() throws IOException {
        st.nextToken();
        return (int) st.nval;
    }
    public long nextLong() throws IOException {
        st.nextToken();
        return (long) st.nval;
    }
    public String readLine() throws IOException {
        return br.readLine();
    }


}
